<?php

  /**
   * Comment
   *
   * ORM для таблицы комментариев
   *
   * @property      string $comment    тест коммента
   * @property      string $table      имя таблицы
   * @property      int    $rec_id     идентификатор прокомментированной записи
   * @property      int    $stamp      время создания
   * @property-read bool   $forPost    комментарий для поста
   * @property-read int    $originPost идентификатор прокомментированного поста
   * @method Comment acting()    выборка действующих комментов
   * @method Comment sentenced() выборка удаленных комментов
   * @method Comment posts()     выборка прокомментированных постов
   * @method Comment comments()  выборка прокомментированных комментов
   */

  final class Comment extends CommentRecord
  {
  // названия таблиц, записи в которых могут быть прокомментированы
    const POSTS    = "posts";
    const COMMENTS = "comments";

    /**
     * вернуть экземпляр модели
     *
     * @return Comment
     * @access public
     */
    public static function model($className = __CLASS__)
    {
      return parent::model($className);
    }

    /**
     * правила проверки атрибутов модели
     *
     * @return array[]
     * @access public
     */
    public function rules()
    {
      return array(
        array("id", "exist", "className" => "Comment", "allowEmpty" => false, "on" => "update"),
        array("comment", "required"),
        array("table", "in", "range" => $this->enum("table"), "allowEmpty" => false),
        array("rec_id", "exists", "className" => $this->forPost ? "Post" : "Comment", "allowEmpty" => false),
        array("stamp", "safe")
      ) + parent::rules();
    }

    /**
     * действия перед проверкой
     *
     * @return bool
     * @access protected
     */
    protected function beforeValidate()
    {
      if ($success = parent::beforeValidate())
        $this->comment = self::validHTML($this->comment, false);

      return $success;
    }

    /**
     * параметры выборки
     *
     * @return array[]
     * @access public
     */
    public function defaultScope()
    {
      return array("order" => "`stamp` desc") +  parent::defaultScope();
    }

    /**
     * наборы фильтров для выборки
     *
     * @return array[]
     * @access public
     */
    public function scopes()
    {
      return $this->enumScopes("table") + parent::scopes();
    }

    /**
     * действия перед сохранением
     *
     * @return bool
     * @access protected
     */
    protected function beforeSave()
    {
      if ($success = parent::beforeSave())
        $this->comment = self::validHTML($this->comment);

      return $success;
    }

    /**
     * действия после сохранения
     *
     * @return void
     * @access protected
     */
    protected function afterSave()
    {
      parent::afterSave();

      /** @var $post Post */
      if ($this->forPost && ($post = Post::model()->findByPk($this->rec_id)))
        $post->saveAttributes(array("last_comment" => $this->comment, "lc_stamp" => $this->stamp));
    }

    /**
     * комментарий для поста
     *
     * @return bool
     * @access public
     */
    public function getForPost()
    {
      return !strcasecmp($this->table, self::POSTS);
    }

    /**
     * вернуть идентификатор поста
     *
     * @return int
     * @access public
     */
    public function getOriginPost()
    {
      /** @var $comment Comment */
      $comment = $this;
      /** @var $post Post */
      $post = null;

      while ($comment && !$post)
      {
        $id = $comment->rec_id;
        if ($comment->forPost)
          $post = Post::model()->findByPk($id);
        else
          $comment = $comment->findByPk($id);
      }

      return $post;
    }
  }

?>
